Se introduce en el módulo 11 a los conceptos de exploración de información, como parte de los análisis exploratorio en minería y ciencia de datos.
A pesar de estar trabajando con información en los diferentes módulos del curso es importante para un análsiis exploratorio y en caso de continuarse con análisis predictivos establecer criterios formales sobre los datos.
Es una propiedad o característica de un fenómeno o un individuo: temperatura, estado civil, monto de ahorro, etc. El valor contenido en la variable es el dato. La secuencia de datos de esa variables corresponde a las observaciones y se pueden asociar a momentos (tiempo) o estados.
Una colección de variables describen en forma “suficiente” a un fenómeno o individuo: registro de DB, punto de medición, objeto, entidad, observación.
Es una variables que contiene números y pueden ser tratados de forma estadística y mediante análisis numéricos, por ejemplo series de tiempo de: niveles de embalses, temparaturas a lo largo del año, distancia, derivadas e integrales, etc.
Son variables numéricas y se representan con números enteros o en punto flotante, incluyendo números complejos.
Son las variables numéricas que tiene valores puntuales y normalmente se representan con valores enteros.
Son las variables numéricas que tiene cualquier valor y normalmente se representan con valores en punto flotante (no existen reales en las computadoras), cuando la observación de tipo contínua se asocia a una “etampa de tiemp” (timestamp) se considera una variables histórica o series de tiempo y para ellas existen métodos de predicción por regresión.
Es la variables que tiene como valor una descripción (enumerado) que categoriza la variable: Sexo femenino, masculino, el estado civil, un catálogo de carreras universitarias. Pueden ser valores numéricos que representan los estados de la variable pero no tiene sentido operaciones como: suma, resta, media. Se pueden cuantificar mediante su cuenta por tipo de estado y así sobre los valores obtenidos establecer inferencias estadísticas: porcentaje de casados y solteros por ejemplo a partir de contar cada categoría.
Se denominan variables categóricas y para efectos de ciencia y minería de datos deben ser explicitamente diferenciados de variables numéricas.
Las variables cualitativas son de tipo nominales y/o ordinales.
Permiten contar su valor, comparar entre catagorías, no se pueden hacer operaciones numéricas y hay que ajustarlas para poder hacer cálculos, ejemplo: número de teéfono, número cédula o pasaporte, código postal, etc.
No son números (en primera instancia) ya que corresponden a categorías: nombre de región donde vive, sexo, estado civil, nombre del partido político de simpatía,
También corresponden a estados que no tienen orden, no tienen distancia o intervalo entre sus valores, se pueden contar para realizar operaciones, ejemplo: Grado académico (bachiller, master, doctor)
Estas varibles es necesario categorizarlas (establecer un código para cada estado) y para ello:
Para el análisis de información, sea exploratorio (análsiis sobre los datos) o preidictivo (metodología para predecir datos futuros a partir de los actuales), es importante realizar un análisis preliminar acompañado de ser necesario de transformaciones de datos: re-escalamientos, categorización de variables, normalización, descomposición de datos (obtener el mes del año de una variable timestamp),etc.
Con esta fase cubierta se procede a realizar análisis más profundos sobre los datos: estadísticas, clasificaciones, descomposiciones en tiempo o frecuencia, transformaciones lineales, etc.
Para hacer el análisis una revisión de la metodología, se utilizará una muestra retrospectiva de hombres en una región de alto riesgo de enfermedad cardíaca en Western Cape, Sudáfrica. Hay aproximadamente dos controles por caso de enfermedad coronaria. Muchos de los hombres con enfermedad coronaria positiva se han sometido a un tratamiento de reducción de la presión arterial y otros programas para reducir sus factores de riesgo después de su evento de enfermedad coronaria. En algunos casos, las mediciones se realizaron después de estos tratamientos. Estos datos se toman de un conjunto de datos más grande, descrito en Rousseauw et al, 1983, South African Medical Journal.
Los detalles de la información son los siguientes:
sbp: presión arterial sistólica
tabaco: tabaco acumulativo (kg)
ldl: colesterol unido a lipoproteínas de baja densidad
adiposity: adiposidad
famhist: antecedentes familiares de enfermedad cardíaca (presente, ausente)
typea: comportamiento tipo A
obesidad: nivel de obesidad.
alcohol: consumo actual de alcohol
edad: edad de inicio
chd: tienen enfermedad coronaria (Si/No)
Se observa que chd y famhsit son definitivamente variables categóticas, las otras son numéricas.
# Análisis Exploratorios Básico
# =============================
# Paso 1: Cargar la tabla de Datos
# Paquetes
import os
import pandas as pd
import numpy as np
import scipy.stats
import matplotlib.pyplot as plt
datos = pd.read_csv('../Datos/SAheart.csv',delimiter=';',decimal=".")
print(datos.head())
## sbp tobacco ldl adiposity famhist typea obesity alcohol age chd
## 0 160 12.00 5.73 23.11 Present 49 25.30 97.20 52 Si
## 1 144 0.01 4.41 28.61 Absent 55 28.87 2.06 63 Si
## 2 118 0.08 3.48 32.28 Present 52 29.14 3.81 46 No
## 3 170 7.50 6.41 38.03 Present 51 31.99 24.26 58 Si
## 4 134 13.60 3.50 27.78 Present 60 25.99 57.34 49 Si
print(datos.shape)
## (462, 10)
print(datos.columns)
## Index(['sbp', 'tobacco', 'ldl', 'adiposity', 'famhist', 'typea', 'obesity',
## 'alcohol', 'age', 'chd'],
## dtype='object')
En el siguiente código se presentan datos estadísrticos a partir de la tabla pandas entre estas: la media, la mediana, desviación estándar, maximo y quartiles. Tambié se aplican operaciones sobre datos NO NUMERICOS
# Paso 2: presentación de estadísticas básicas
print(datos.dropna().describe())
## sbp tobacco ldl ... obesity alcohol age
## count 462.000000 462.000000 462.000000 ... 462.000000 462.000000 462.000000
## mean 138.326840 3.635649 4.740325 ... 26.044113 17.044394 42.816017
## std 20.496317 4.593024 2.070909 ... 4.213680 24.481059 14.608956
## min 101.000000 0.000000 0.980000 ... 14.700000 0.000000 15.000000
## 25% 124.000000 0.052500 3.282500 ... 22.985000 0.510000 31.000000
## 50% 134.000000 2.000000 4.340000 ... 25.805000 7.510000 45.000000
## 75% 148.000000 5.500000 5.790000 ... 28.497500 23.892500 55.000000
## max 218.000000 31.200000 15.330000 ... 46.580000 147.190000 64.000000
##
## [8 rows x 8 columns]
print(datos.mean(numeric_only=True))
## sbp 138.326840
## tobacco 3.635649
## ldl 4.740325
## adiposity 25.406732
## typea 53.103896
## obesity 26.044113
## alcohol 17.044394
## age 42.816017
## dtype: float64
print(datos.median(numeric_only=True))
## sbp 134.000
## tobacco 2.000
## ldl 4.340
## adiposity 26.115
## typea 53.000
## obesity 25.805
## alcohol 7.510
## age 45.000
## dtype: float64
print(datos.std(numeric_only=True))
## sbp 20.496317
## tobacco 4.593024
## ldl 2.070909
## adiposity 7.780699
## typea 9.817534
## obesity 4.213680
## alcohol 24.481059
## age 14.608956
## dtype: float64
print(datos.max(numeric_only=True))
# Los percentiles
## sbp 218.00
## tobacco 31.20
## ldl 15.33
## adiposity 42.49
## typea 78.00
## obesity 46.58
## alcohol 147.19
## age 64.00
## dtype: float64
print(datos.quantile(np.array([0,.25,.50,.75,1])))
## sbp tobacco ldl adiposity typea obesity alcohol age
## 0.00 101.0 0.0000 0.9800 6.7400 13.0 14.7000 0.0000 15.0
## 0.25 124.0 0.0525 3.2825 19.7750 47.0 22.9850 0.5100 31.0
## 0.50 134.0 2.0000 4.3400 26.1150 53.0 25.8050 7.5100 45.0
## 0.75 148.0 5.5000 5.7900 31.2275 60.0 28.4975 23.8925 55.0
## 1.00 218.0 31.2000 15.3300 42.4900 78.0 46.5800 147.1900 64.0
# Tabla cruzada
# En las variables no numéricas
# Contando
print(pd.crosstab(index=datos["chd"],columns="count"))
## col_0 count
## chd
## No 302
## Si 160
print(pd.crosstab(index=datos["famhist"],columns="count"))
# Otra forma
## col_0 count
## famhist
## Absent 270
## Present 192
print(datos['chd'].value_counts())
## No 302
## Si 160
## Name: chd, dtype: int64
print(datos["famhist"].value_counts())
## Absent 270
## Present 192
## Name: famhist, dtype: int64
famhist_chd = pd.crosstab(index=datos["famhist"], columns=datos["chd"])
print(famhist_chd)
## chd No Si
## famhist
## Absent 206 64
## Present 96 96
famhist_chd.index = ["Absent","Present"]
print(famhist_chd)
# Contando
## chd No Si
## Absent 206 64
## Present 96 96
g_chd = pd.crosstab(index=datos["chd"],columns="count")
print(g_chd )
## col_0 count
## chd
## No 302
## Si 160
print(g_chd['count'][0])
## 302
print(g_chd['count'][1])
## 160
g_famhist = pd.crosstab(index=datos["famhist"],columns="count")
print(g_famhist)
## col_0 count
## famhist
## Absent 270
## Present 192
print(g_famhist['count'][0])
## 270
print(g_famhist['count'][1])
## 192
En este apartado se hace un recorrido sobre los datos en forma gráfica sobre la base estadística de la información contenida.
# Paso 3: Gráficos importantes
# Graficando
# Gráfico chd
alto = [g_chd['count'][0], g_chd['count'][1]]
barras = ('No', 'Sí')
y_pos = np.arange(len(barras))
null=plt.bar(y_pos, alto, color=['red','blue'])
null=plt.xticks(y_pos, barras)
plt.show()
# Gráfico famhist
alto = [g_famhist['count'][0], g_famhist['count'][1]]
barras = ('Absent ', 'Present')
y_pos = np.arange(len(barras))
null=plt.bar(y_pos, alto, color=['red','blue'])
null=plt.xticks(y_pos, barras)
plt.show()
plt.close()
# Gráfico chd
alto = [g_chd['count'][0], g_chd['count'][1]]
barras = ('No', 'Sí')
y_pos = np.arange(len(barras))
null=plt.bar(y_pos, alto, color=['red','blue'])
null=plt.xticks(y_pos, barras)
plt.show()
plt.close()
# Gráfico famhist
alto = [g_famhist['count'][0], g_famhist['count'][1]]
barras = ('Absent ', 'Present')
y_pos = np.arange(len(barras))
null=plt.bar(y_pos, alto, color=['red','blue'])
null=plt.xticks(y_pos, barras)
plt.show()
plt.close()
# Box Plots
print(datos.head())
## sbp tobacco ldl adiposity famhist typea obesity alcohol age chd
## 0 160 12.00 5.73 23.11 Present 49 25.30 97.20 52 Si
## 1 144 0.01 4.41 28.61 Absent 55 28.87 2.06 63 Si
## 2 118 0.08 3.48 32.28 Present 52 29.14 3.81 46 No
## 3 170 7.50 6.41 38.03 Present 51 31.99 24.26 58 Si
## 4 134 13.60 3.50 27.78 Present 60 25.99 57.34 49 Si
boxplots = datos.boxplot(return_type='axes')
plt.show()
plt.close()
# Función de densidad
densidad = datos[datos.columns[:1]].plot(kind='density')
plt.show()
plt.close()
densidad = datos[datos.columns[:1]].plot(kind='density')
plt.show()
plt.close()
densidad = datos[datos.columns[8:9]].plot(kind='density')
plt.show()
plt.close()
densidad = datos['age'].plot(kind='density')
plt.show()
plt.close()
densidad = datos[datos.columns[:10]].plot(kind='density')
plt.show()
plt.close()
Los siguientes gráficos muestran histogramas de los datos.
densidad = datos[datos.columns[:1]].plot(kind='hist')
plt.show()
plt.close()
densidad = datos[datos.columns[8:9]].plot(kind='hist')
plt.show()
plt.close()
densidad = datos['age'].plot(kind='hist')
plt.show()
plt.close()
densidad = datos[datos.columns[:10]].plot(kind='hist')
plt.show()
plt.close()
Permite determinar si el conjunto de datos corresponde con una distribución normal, lo que facilitaría aplicar sobre los datos una serie de operaciones que este tipo de distribuciones permite
# Test de Shapiro-Wilk
shapiro_resultados = scipy.stats.shapiro(datos['age'])
print(shapiro_resultados)
## ShapiroResult(statistic=0.9370468258857727, pvalue=4.594895969788071e-13)
Test_Estadistico = shapiro_resultados[0]
print(Test_Estadistico)
## 0.9370468258857727
p_value = shapiro_resultados[1]
print(p_value)
## 4.594895969788071e-13
print(p_value < Test_Estadistico)
# Da True significa que los datos siguen la normal
# Test de Shapiro-Wilk
## True
densidad = datos['obesity'].plot(kind='density')
plt.show()
plt.close()
shapiro_resultados = scipy.stats.shapiro(datos['obesity'])
print(shapiro_resultados)
## ShapiroResult(statistic=0.96074378490448, pvalue=9.225323838180088e-10)
Test_Estadistico = shapiro_resultados[0]
print(Test_Estadistico)
## 0.96074378490448
p_value = shapiro_resultados[1]
print(p_value)
## 9.225323838180088e-10
print(p_value < Test_Estadistico)
# Da True significa que los datos siguen la normal
## True
# Scatter Plot entre dos variables
colores = []
for i in datos['chd']:
if i=='Si':
colores.append('red')
else:
colores.append('blue')
# Orientado a objetos
datos.plot(kind='scatter', x='age', y='obesity', c=colores)
plt.show()
plt.close()
# Estilo funcional
plt.scatter(datos['age'], datos['obesity'],c=colores)
plt.xlabel('age')
plt.ylabel('obesity')
plt.show()
plt.close()
# Gráfico de todas las variables 2 a 2
# El paquete Seaborn
import seaborn as sns
null=sns.pairplot(datos, hue='chd', height=2.5)
plt.show()
plt.close()
null=sns.pairplot(datos, hue='famhist', height=2.5)
plt.show()